#coding=utf-8
# Copyright 2011-2012 Maxim Petrov <maximpetrov@yahoo.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 3 or any later version.

from modal_window import ModalWindow
from controls import TextField, TextArea, Button, Label
import curses.ascii

class CommitWindow(ModalWindow):
    """Класс модального окна выполнения коммита"""

    # Переопределяемые от базового класса параметры
    _PREFERRED_MIN_WIDTH = 40
    _PREFERRED_MIN_HEIGHT = 20
    _MIN_WIDTH = 20
    _MIN_HEIGHT = 9
    _message_visible = True
    _EXIT_BUTTON = u'Cancel'
    _title = _(u'Commit')
    # Подписи кнопок
    __OK = _(u'OK')
    __CANCEL = _(u'Cancel')

    def __init__(self, comment=u'', focus_on_OK=False, position=None):
        """
        Конструктор окна коммита.

        Аргументы:
            comment - начальное содержимое поля комментария.
        """

        self.__cp_pad = TextArea(None, lambda w, h: (1, 1, w - 2, h - 6),
                          _(u'Commit message:'), comment, position)
        self.__op_field = TextField(None, lambda w, h: (2, h - 4, w - 4, None))
        self.__op_label = Label(None, lambda w, h: (2, h - 5, w - 4, None),
                                                        _(u'Commit options:'))
        self.__ok_button = Button(None, lambda w, h: \
            (w / 4 - len(self.__OK) / 2, h - 2, None, None), self.__OK)
        self.__cancel_button = Button(None, lambda w, h: \
            (w * 3 / 4 - len(self.__CANCEL) / 2, h - 2, None, None), self.__CANCEL)
        self._controls = [(self.__cp_pad, True),
                          (self.__op_label, False), (self.__op_field, False),
                          (self.__ok_button, True), (self.__cancel_button, True)]
        if focus_on_OK:
            self._selected = self.__ok_button

    def handle_keypress(self, ch, uni):
        """
        Функция отрабатывает нажатие клавиши.

        Аргументы:
            ch - код нажатой клавиши
            uni - признак того, что ch - является символом в юникоде

        Возвращаемое значение:
            Если нажатие этой клавиши привело к закрытию окна,
            то возвращает словарь параметров:
                comment - комментарий к коммиту
                options - набор дополнительных опций для коммита
            иначе возвращает None
        """

        result = ModalWindow.handle_keypress(self, ch, uni)
        if result is not None:
            return result
        # По нажатию табуляции переходим к следующему элементу управления
        if ch == ord('\t'):
            self._next_control()
        # Если нажат Enter на одной из кнопок, то возвращаем название
        # кнопки, если нажат OK, то возвращаем еще и комментарий.
        if ch == ord('\n') and self._selected == self.__ok_button:
            return {u'button': u'OK',
                u'message': self.__cp_pad.text}
        elif ch == ord('\n') and self._selected == self.__cancel_button:
            return {u'button': u'Cancel'}
        else:
            self._selected.handle_keypress(ch, uni)

